﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AllInOne.Dados;
using AllInOne.Util;
using System.Data.Objects;

namespace AllInOne.Negocio
{
    class NegocioUsuario : Negocio<Usuario>
    {
        #region Negocio<Usuario> Constructor

        public NegocioUsuario()
        {

        }

        #endregion;

        #region Negocio<Usuario> Members

        /// <summary>
        /// Persiste um objeto 'Usuario'
        /// </summary>
        /// <param name="objeto">Usuario a ser persistido</param>
        /// <returns>Id do item persistido</returns>
        public int adicionar(Usuario objeto)
        {
            int retorno = -1;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    mdc.AddObject(objeto.EntityKey.EntitySetName, objeto);
                    int result = mdc.SaveChanges();

                    if (result > 0)
                        retorno = objeto.Id;
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }
            return retorno;
        }


        /// <summary>
        /// Atualiza o item atual, caso esteja atualmente persistido
        /// </summary>
        /// <param name="objeto">Objeto a atualizar no banco de dados</param>
        /// <returns><code>true</code>- Atualizado com sucesso, <code>false</code>- Erro ao persistir</returns>
        public bool atualizar(Usuario objeto)
        {
            bool retorno = false;

            using (ModeloDadosContainer mdc = new ModeloDadosContainer())
            {
                Object original;

                if (mdc.TryGetObjectByKey(objeto.EntityKey, out original))
                {
                    mdc.ApplyCurrentValues(objeto.EntityKey.EntitySetName, objeto);
                }

                int result = mdc.SaveChanges();

                if (result > 0)
                    retorno = true;
            }
            return retorno;
        }

        /// <summary>
        /// Exclui um item do banco de dados
        /// </summary>
        /// <param name="objeto">Objeto a excluir</param>
        /// <returns><code>true</code>- Excluído com sucesso, <code>false</code>- Erro ao exlcuir</returns>
        public bool remover(Usuario objeto)
        {
            bool retorno = false;

            using (ModeloDadosContainer mdc = new ModeloDadosContainer())
            {
                Usuario tmp = mdc.GetObjectByKey(objeto.EntityKey) as Usuario;

                if (tmp != null)
                {
                    mdc.DeleteObject(tmp);
                    int result = mdc.SaveChanges();

                    if (result > 0)
                        return true;
                }
            }
            return retorno;
        }


        /// <summary>
        /// Recupera a lista de Usuarios atualmente persistidos
        /// </summary>
        /// <returns>Usuarios atualmente persistidos no banco de dados</returns>
        public List<Usuario> pesquisar()
        {
            List<Usuario> retorno = null;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    retorno = mdc.PessoaSet. OfType<Usuario>().ToList<Usuario>();
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }

            return retorno;
        }

        public Usuario pesquisar(int id)
        {
            Usuario retorno = null;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    retorno = mdc.PessoaSet.OfType<Usuario>().First<Usuario>(usuario => usuario.Id == id);
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }

            return retorno;
        }

        public Usuario pesquisar(string login)
        {
            Usuario retorno = null;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    retorno = mdc.PessoaSet.OfType<Usuario>().First<Usuario>(usuario => usuario.Login.ToLower() == login.ToLower());
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }

            return retorno;
        }

        /// <summary>
        /// Valida um objeto 'Usuario'
        /// </summary>
        /// <param name="objeto">Usuario a ser validado</param>
        /// <returns>Se o item é válido ou não</returns>
        public bool autenticar(string login, string senha)
        {
            bool retorno = false;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    Usuario usuario = this.pesquisar(login);

                    if (usuario != null && usuario.Senha.Equals(senha))
                        retorno = true;
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }
            return retorno;
        }


        #endregion
    }
}
